std::enable 您所在的位置:网站首页 enable_if_t value std::enable

std::enable

#std::enable| 来源: 网络整理| 查看: 265

std::enable_if 的几种用法 tech 6 cpp 2

std::enable_if 顾名思义,满足条件时类型有效。作为选择类型的小工具,其广泛的应用在 C++ 的模板元编程(meta programming)中。它的定义也异常的简单:

template struct enable_if { }; template struct enable_if { using type = T; };

由上可知,只有当第一个模板参数为 true 时,type 才有定义,否则使用 type 会产生编译错误,并且默认模板参数可以让你不必指定类型。下面说说它的几种使用方法:

用法一:类型偏特化

在使用模板编程时,经常会用到根据模板参数的某些特性进行不同类型的选择,或者在编译时校验模板参数的某些特性。例如:

template struct check; template struct check { static constexpr bool value = T::value; };

上述的 check 只希望选择 value==true 的 T,否则就报编译时错误。如果想给用户更友好的提示,可以提供结构体的原型定义,并在其中进行 static_assert 的静态检查,给出更明确的字符串说明。

用法二:控制函数返回类型

对于模板函数,有时希望根据不同的模板参数返回不同类型的值,进而给函数模板也赋予类型模板特化的性质。典型的例子可以参看 tuple 的获取第 k 个元素的 get 函数:

template typename std::enable_if::type get(tuple &t) { return t.tail; } template typename std::enable_if::type get(tuple &t) { tuple &base = t; return get(base); }

由于函数模板不能偏特化,通过 enable_if 便可以根据 k 值的不同情况选择调用哪个 get,进而实现函数模板的多态。

用法三:校验函数模板参数类型

有时定义的模板函数,只希望特定的类型可以调用,参考 cppreference 官网示例,很好的说明了如何限制只有整型可以调用的函数定义:

template typename std::enable_if::type is_odd(T t) { return bool(t%2); } template bool is_even(T t) { return !is_odd(t); }

一个通过返回值,一个通过默认模板参数,都可以实现校验模板参数是整型的功能。

Reference SFINAE: Substitution Failure Is Not An Error 15 July 2016 Next Post → ← Earlier Post


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有